#ifndef ANALYZE_SETTING_H
#define ANALYZE_SETTING_H

#include <boost/algorithm/string.hpp>
#include <set>
#include <string>
#include <vector>

namespace rocket {
namespace share {

/**
 * @brief Rocket工具在解析目标文件时的设定信息
 */
struct RocketAnalyzeSetting {
  /**
   * @brief 集成命名空间
   * @details 待测函数中在集成命名空间中的符号不会作为可插桩的对象
   */
  std::set<std::string> exclude_namespace;

  /**
   * @brief 是否进行完全解析
   */
  enum class AnalyzeLevel : unsigned {
    AL_Local = 0,  // 仅本地文件解析
    AL_Used = 1,   // 所有被本地文件中函数直接/间接使用
    AL_Full = 2,   // 该编译单元内所有的函数
  };

  AnalyzeLevel analyze_level = AnalyzeLevel::AL_Used;

  bool no_coverage = false;

  bool constexpr_is_stub = true;

  bool retcopy_is_stub = true;

  bool analyze_line_statistic = true;

  bool analyze_local_vars = true;

  bool analyze_macro_expansions = true;

  bool analyze_indirect_stubs = false;

  bool analyze_fixedaddr_offsets = true;

  bool analyze_locvar_size = true;

  std::string debug_result;

 public:
  void addIntegratedNamespace(const std::string& namespace_name) {
    std::vector<std::string> buf;
    boost::split(buf, namespace_name, [](char c) { return c == ','; });
    exclude_namespace.insert(buf.begin(), buf.end());
  }
  void addIntegratedNamespace(const std::vector<std::string>& namespaces_name) {
    for (auto& namespace_name : namespaces_name) {
      addIntegratedNamespace(namespace_name);
    }
  }
};

}  // namespace share

}  // namespace rocket

#endif  // ANALYZE_SETTING_H
